package projeto.tarefaagendada.cgd;

import java.util.Collection;
import java.util.Date;
import java.util.List;

import javax.persistence.Query;

import org.springframework.stereotype.Repository;

import plataforma.autenticacao.cdp.Usuario;
import plataforma.base.cdp.Criterio;
import plataforma.base.cdp.ObjetoPagina;
import plataforma.crudestatico.cgd.DaoBase;
import projeto.administrativo.funcionario.cdp.ResponsavelAtividade;
import projeto.tarefaagendada.cdp.TarefaAgendada;

@Repository
public class DaoTarefaAgendada extends DaoBase<TarefaAgendada> {

	// TODO NANDOPHO Passar para tipo parametrizado
	public Collection<TarefaAgendada> recuperarTodosPaginado(
			ObjetoPagina objetoPagina) {

		StringBuilder sb = new StringBuilder();
		sb.append("select tarefa from TarefaAgendada tarefa");

		// adicionando where
		sb.append(" where 1=1 ");

		if (objetoPagina.getCriteriosSimples() != null) {

			for (Criterio criterio : objetoPagina.getCriteriosSimples()) {

				sb.append(" and " + criterio.toHQL());

			}

		}
		if (objetoPagina.getCriterioOrdenacao() != null)
			sb.append(" order by "
					+ objetoPagina.getCriterioOrdenacao().toString());

		Query consulta = getEntityManager().createQuery(sb.toString());
		consulta.setFirstResult(objetoPagina.getFirstResults());
		consulta.setMaxResults(objetoPagina.getMaxResults());

		return (Collection<TarefaAgendada>) consulta.getResultList();

	}

	@Override
	public int recuperarQteTodos(ObjetoPagina objetoPagina) {

		StringBuilder sb = new StringBuilder();
		sb.append(" select count(id) from TarefaAgendada tarefa");
		// adicionando where
		sb.append(" where 1=1 ");

		if (objetoPagina.getCriteriosSimples() != null) {

			for (Criterio criterio : objetoPagina.getCriteriosSimples()) {

				sb.append(" and " + criterio.toHQL());

			}

		}

		Long count = (Long) getEntityManager().createQuery(sb.toString())
				.getSingleResult();

		return count.intValue();
	}

	public List<TarefaAgendada> recuperarTodosAlertaEmail(Date dtInicio, Date dtFim) {


		StringBuilder sb = new StringBuilder();
		sb.append("select t from TarefaAgendada t left outer join fetch  t.usuario ");
		sb.append(" where 1=1 ");
		sb.append("  and t.alertaEmail = true ");
		sb.append("  and t.cancelado = false ");
		sb.append("  and t.dataPlanejada  between :parDataInicio and :parDataFim ");
		
		Query q = getEntityManager().createQuery(sb.toString());
		q.setParameter("parDataInicio", dtInicio);
		q.setParameter("parDataFim", dtFim);
		return q.getResultList();
	}
	
	public ResponsavelAtividade recuperaResponsavelPorUsuario(Usuario u){
		
		StringBuilder sb = new StringBuilder();
		sb.append("from ResponsavelAtividade where usuario.id= :parId ");
		
		Query q = getEntityManager().createQuery(sb.toString());
		q.setParameter("parId", u.getId());
		
		return (ResponsavelAtividade)q.getSingleResult();
	}

}
